/*
 * Packet.h
 *
 *  Created on: Apr 13, 2012
 *      Author: kakus
 */

#ifndef PACKET_H_
#define PACKET_H_

/*
 * Klasa interpretuje odebrane dane.
 *
 * Struktura danych wysylanych miedzy serwerem a
 * klientem ma postac:
 * [typ_wiadomosci 4 bajty][reszta danych ... ]
 *
 * Klasa bedzie:
 * 1. Pakowac dane co znaczy ze po jej odpowiednim
 * zainicjiowaniu bedzie potrafila zwrocic ciag bajtow
 * gotowych do wyslania.
 *
 * 2. Rozpakowyac dane - jesli podanamy wejsciowy ciag
 * bajtow to pola klasy zostana odpowiednio uzupelnione.
 */
class Packet {
private:

	unsigned int dataWrittenToBuffer;
public:

	unsigned int type;
	void * data;
	unsigned int dataSize;

	Packet();

	/*
	 * Inicjuje pola klasy i kopiuje dane z pod wskaznika data.
	 *
	 * @return true - udalo sie zalokowac miesjsce i przekopiowac
	 * 				  dane
	 * @return false - nie udalo sie zalokowac miesjca lub bledny
	 * 				   naglowek.
	 */
	bool pack(unsigned int type, const void * data, unsigned int dataSize);

	/*
	 * W miesjcu podanym przez wskaznik funkcja wpisuje ciag bajtow.
	 * Jesli rozmiar bufora mniejszy od pakietu to zapamietuje ile
	 * bajtow zostalo wpisanych i przy kolejnym wywolaniu wpisane
	 * zostna kolejne.
	 *
	 * @return true - udalo sie wpisac pakiet do bufora
	 * @return false - nie udalo sie wpisac wszystkich danych do
	 * 				   bufora
	 */
	bool writeToBuffer(void * buffer, unsigned int size);

	/*
	 * Rozpakowywuje wiadomosc, czyli inicjuje siebie danymi
	 * z bufora.
	 *
	 * @return true - calosc zakonczona powodzeniem
	 * @return false - bledne dane w buforze np.
	 * 				   typ naglowka nierozpoznawalny,
	 * 				   nie mozna zalokowac miesca
	 */
	bool unpack(const void * buffer, unsigned int size);

	virtual ~Packet();
};

#endif /* PACKET_H_ */
